package com.infusionesuci2Pro;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import com.infusionesuci.utils.Archivos;
import com.infusionesuci.utils.Geolocalizacion;
import com.infusionesuci.utils.GlobalConfiguration;
import com.infusionesuci.utils.WebService;
import com.infusionesuci2Pro.R;
import com.google.analytics.tracking.android.EasyTracker;
import com.google.analytics.tracking.android.GoogleAnalytics;
import com.google.analytics.tracking.android.MapBuilder;
import android.app.Activity;
import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.graphics.Typeface;
import android.location.LocationManager;
import android.net.ConnectivityManager;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.telephony.TelephonyManager;
import android.text.Editable;
import android.text.SpannableString;
import android.text.TextWatcher;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.Window;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Spinner;
import android.widget.Toast;

public class ListaMedicamentos extends Activity implements OnItemClickListener {

	public ListView lstMedicamentos;
	public Medicamentos medicamentos;
	public ArrayList<Medicamento> listaCentral;
	private Archivos archivos = null;
	private InputStreamReader archivoEntrada;
	private OutputStreamWriter archivoSalida;
	private String imei;
	private String nombre;
	private String email;
	private String numero;
	private String especialidad;
	private Button registrar;
	private Dialog dialog;
	private Spinner spinner;
	private EditText tvnombre;
	private EditText tvemail;
	private EditText txtnumero;
	private String info;
	private WebService ws;
	private Typeface fuenteTitulo;
	private TextView tituloap;
	private EditText Edit;
	private Boolean hayInfusiones;
	private TextView terminos;
	private CheckBox chkTerminosCondiciones;
	
	//Geolocalizacion:
	private LocationManager locationManager;
	private String proveedor="";
	private Geolocalizacion geo;
	private Double [] coordenadas;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_medicamentos_nueva);
		
		//Analytics
		GoogleAnalytics.getInstance(this).getTracker("UA-45986553-2");
		
		//Geolocalizacion
		coordenadas = new Double[2];
		this.locationManager = (LocationManager) this.getSystemService(Context.LOCATION_SERVICE);
		this.proveedor = LocationManager.NETWORK_PROVIDER;
		this.geo = new Geolocalizacion(locationManager);

		this.hayInfusiones=false;
		this.tituloap = (TextView) findViewById(R.id.tituloapp);
		this.Edit = (EditText) findViewById(R.id.search);
		this.lstMedicamentos = (ListView) findViewById(R.id.lst);
		this.ws = new WebService();
		this.archivos = new Archivos();
		this.fuenteTitulo = Typeface.createFromAsset(getAssets(),"Roboto-Regular.ttf");
		this.tituloap.setTypeface(this.fuenteTitulo);
		String infusiones="";
		
		/**
		 * Metodo para cargar la informacion del usuario, si esta almacenada y no se ha enviado, se mira si
		 * hay internet y se envia, si ya se envio o no hay internet no se hace nada.
		 * Si no hay informacion se le pide al usuario un registro en el catch, y si hay internet se envia y
		 * si no se almacena.
		 */
		try {
			try {
				this.archivoEntrada = new InputStreamReader(openFileInput("infusiones.txt"));
				infusiones = archivos.leer(archivoEntrada);
				if (infusiones != null && !infusiones.equals("") && hayInternet()) {
					this.hayInfusiones = true;
				}
			} catch (FileNotFoundException e) {}
			this.archivoEntrada = new InputStreamReader(openFileInput("informacion.txt"));
			info = archivos.leer(archivoEntrada);
			String[] datos = info.split("#");
			if (datos[0].toUpperCase().equals("NO")) {
				if (hayInternet()) {
					imei = datos[1];
					nombre = datos[2];
					email = datos[3];
					numero = datos[4];
					especialidad = datos[5];
					if(this.hayInfusiones){
						new EnviarInformacion().execute("datosUsuario","datosInfusiones",infusiones);
					}
					else{
						new EnviarInformacion().execute("datosUsuario","");
					}
				}
			}
			else{
				if(hayInternet()&&this.hayInfusiones){
					new EnviarInformacion().execute("","datosInfusiones",infusiones);
				}
			}
		} catch (FileNotFoundException e) {
			TelephonyManager mngr = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);//se obtiene el imei del celular
			imei = mngr.getDeviceId();
			
			this.dialog = new Dialog(this);//Se crea el PopUp para registro.
			this.dialog.setCancelable(false);
			this.dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
			this.dialog.setContentView(R.layout.registro);
			this.dialog.setTitle("Comentarios");

			//Se referencian los campos de la vista del registro:
			this.spinner = (Spinner) dialog.findViewById(R.id.spinner2);
			this.tvnombre = (EditText) dialog.findViewById(R.id.nombre);
			this.tvemail = (EditText) dialog.findViewById(R.id.email);
			this.txtnumero = (EditText) dialog.findViewById(R.id.numero);
			this.registrar = (Button) dialog.findViewById(R.id.btnregistrar);
			this.chkTerminosCondiciones = (CheckBox) dialog.findViewById(R.id.chkTerminos);
			
			this.terminos = (TextView) dialog.findViewById(R.id.lblTerminos);
			SpannableString spanString = new SpannableString(getResources().getString(R.string.lblAcepto));
			spanString.setSpan(new UnderlineSpan(), 0, spanString.length(), 0);
			this.terminos.setText(spanString);
			
			this.llenarSpiner();
			this.tvnombre.setTypeface(this.fuenteTitulo);
			this.tvemail.setTypeface(this.fuenteTitulo);
			this.txtnumero.setTypeface(this.fuenteTitulo);

			//Se detecta el evento del boton y se revisan campos
			this.registrar.setOnClickListener(new Button.OnClickListener() {
				public void onClick(View v) {
					nombre = tvnombre.getText().toString();
					email = tvemail.getText().toString();
					numero = txtnumero.getText().toString();
					especialidad = spinner.getSelectedItem().toString();
					if (imei == null || imei.equals("")) {
						imei = "t-" + numero;
					}

					if (nombre.equals("") || email.equals("")
							|| numero.equals("")) {
						Toast.makeText(
								getApplicationContext(),
								getResources().getString(R.string.toastCamposIncompletos),
								Toast.LENGTH_LONG).show();
					} else if (!email.matches("^[_A-Za-z0-9-\\+]+(\\.[_A-Za-z0-9-]+)*@"
            + "[A-Za-z0-9-]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$")) {
						Toast.makeText(
								getApplicationContext(),
								getResources().getString(R.string.toastEmailErroneo),
								Toast.LENGTH_LONG).show();
					} else if (!chkTerminosCondiciones.isChecked()) {
						Toast.makeText(
								getApplicationContext(),
								getResources().getString(R.string.toastAceptarTerminos),
								Toast.LENGTH_LONG).show();
					} else {
						info = "no#" + imei + "#" + nombre + "#" + email + "#"
								+ numero + "#" + especialidad;
						if (hayInternet()) {
							dialog.dismiss();
							new EnviarInformacion().execute("datosUsuario", "");
						} else {
							try {
								archivoSalida = new OutputStreamWriter(
										openFileOutput("informacion.txt",
												Activity.MODE_PRIVATE));
							} catch (FileNotFoundException e) {
							}
							archivos.guardar(archivoSalida, info);
							dialog.dismiss();

						}
					}
				}
			});
			
			this.terminos.setOnClickListener(new OnClickListener() {
				
				public void onClick(View v) {
					// TODO Auto-generated method stub
					Intent intent = new Intent(getApplicationContext(), Condiciones.class);
					startActivity(intent);
				}
			});
			dialog.show();
		}
		//Fin informaci??n del usuario
		
		/**
		 * A continuacion se recuperan las infusiones que no se han podido enviar al servidor porque no hay iternet, se
		 * mira si ya hay conexion para enviarlas y se envian, de lo contrario se dejan almacenadas y no se hace nada.
		 * Si no hay infusiones almacenadas no se hace nada.
		 */
		/*
		try {
			this.archivoEntrada = new InputStreamReader(openFileInput("infusiones.txt"));
			String infusiones = archivos.leer(archivoEntrada);
			if (infusiones != null && !infusiones.equals("") && hayInternet()) {
				new EnviarInfusiones().execute(infusiones);
			}
		} catch (FileNotFoundException e) {}
		//fin recuperacion y envio de infusiones almacenadas.
		*/
		
		/**
		 * Se obtienen los medicamentos almacenados en el archivo pruebas.txt que se encuentra en la carpeta raw para
		 * posteriormente mostrarlos en la list view
		 */
		InputStream txt = getResources().openRawResource(R.raw.medicamentos);
		this.medicamentos = new Medicamentos(txt);
		this.listaCentral = this.medicamentos.getMedicamentos();
		this.mostrar(listaCentral);
		this.lstMedicamentos.setOnItemClickListener(this);
		
		//Metodo para filtrar la lista segun lo que el usuario escriba.
		this.Edit.addTextChangedListener(new TextWatcher() {
			public void onTextChanged(CharSequence arg0, int arg1, int arg2,int arg3) {
				if(arg0!=null&&!arg0.equals("")){
					serch(arg0, medicamentos.getMedicamentos());
				}
			}

			public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {}

			public void afterTextChanged(Editable arg0) {}
		});
	}

	/**
	 * Metodo que le ingresa las letras que va escribiendo el usuario y 
	 * busca los medigcamentos asociados a las letras que
	 * valla tecleando y las renderisa en la listView respectiva.
	 */
	public void serch(CharSequence key, ArrayList<Medicamento> lstMedicamento) {
		ArrayList<Medicamento> listaMedicamentos = new ArrayList<Medicamento>();
		for (int i = 0; i < lstMedicamento.size(); i++) {
			if (lstMedicamento.get(i).getNombre().toUpperCase().startsWith(String.valueOf(key).toUpperCase())) {
				listaMedicamentos.add(lstMedicamento.get(i));
			}
		}
		this.listaCentral = listaMedicamentos;
		this.mostrar(listaCentral);
	}

	//Muestra la interfaz con el manual de usuario:
	public void ayuda(View view) {
		//---Analytics---
		EasyTracker easyTracker = EasyTracker.getInstance(this);
		easyTracker.send(MapBuilder
			      .createEvent("ui_action",     // Event category (required)
			                   "ayuda_press",  // Event action (required)
			                   "btn_ayuda",   // Event label
			                   null)  // Event value
			      .build()
			  );
		//----Fin Analytics-----
		Intent intent = new Intent(this, Ayuda.class);
		startActivity(intent);
	}

	/**
	 *Metodo que muestra en el listView la lista que le ingresa
	 * @param lstMedicamento
	 */
	public void mostrar(ArrayList<Medicamento> lstMedicamento) {
		Adaptador adaptador = new Adaptador(this, lstMedicamento);
		lstMedicamentos.setAdapter(adaptador);
	}

	/**
	 * Metodo que detecta si el usuario presiona algun elemento de la lista de medicamentos para pasar su
	 * informaci??n a la siguiente actividad.
	 */
	public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
		//Analytics
		EasyTracker easyTracker = EasyTracker.getInstance(this);
		easyTracker.send(MapBuilder
			      .createEvent("ui_action",     // Event category (required)
			                   "item_press",  // Event action (required)
			                   listaCentral.get(arg2).getNombre(),   // Event label
			                   null)            // Event value
			      .build()
			  );
		//---------
		
			GlobalConfiguration.getSingletonObject().setSelectedMedicamento(listaCentral.get(arg2));
			Intent intent = new Intent(this, ShowDetailMedicamentos.class);
			startActivity(intent);
		
	}

	public void llenarSpiner() {//getResources().getString(R.string.accept);
		ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(this,R.array.especialidad, android.R.layout.simple_spinner_item);
		adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
		String [] ls = { getResources().getString(R.string.spnAnestesia), getResources().getString(R.string.spnCirugia),
				getResources().getString(R.string.spnCIntensivo), getResources().getString(R.string.spnEnfermeria),
				getResources().getString(R.string.spnGinecoobstetricia), getResources().getString(R.string.spnMedInterna),
				getResources().getString(R.string.spnOrtopedia), getResources().getString(R.string.spnUrgencias),
				getResources().getString(R.string.spnOtras) };
		this.spinner.setAdapter(new AdaptadorSpinner(this, R.layout.custom_spinner,ls));
	}

	private boolean hayInternet() {
		ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
		if (cm.getActiveNetworkInfo() != null
				&& cm.getActiveNetworkInfo().isAvailable()
				&& cm.getActiveNetworkInfo().isConnected()) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * Hilo que se invoca cuando hay internet para enviar informacion del usuario.
	 * @author sebastian
	 */
	private class EnviarInformacion extends AsyncTask<String, Void, Void> {

		private JSONObject json_data;
		private Boolean resultado;

		@Override
		protected void onPreExecute() {
			super.onPreExecute();
		}

		@Override
		protected Void doInBackground(String... params){
			if(params[0].equals("datosUsuario")){
				coordenadas = geo.obtenerCoordenadas();
				String[] parametros = { "registroUsuarioPro", imei, nombre, email, numero,
						especialidad, String.valueOf(coordenadas[0]), String.valueOf(coordenadas[1])};

				JSONArray respuesta = ws.conectar(parametros);
				try {
					json_data = respuesta.getJSONObject(0);
					resultado = json_data.getBoolean("respuesta");
					if (resultado) {
						try {
							archivoSalida = new OutputStreamWriter(openFileOutput(
									"informacion.txt", Activity.MODE_PRIVATE));
						} catch (FileNotFoundException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
						info = info.substring(2, info.length());
						info = "si" + info;
						archivos.guardar(archivoSalida, info);
					} else {
						try {
							archivoSalida = new OutputStreamWriter(openFileOutput(
									"informacion.txt", Activity.MODE_PRIVATE));
							archivos.guardar(archivoSalida, info);
						} catch (FileNotFoundException e) {

						}
					}
				} catch (JSONException e) {
					try {
						archivoSalida = new OutputStreamWriter(openFileOutput(
								"informacion.txt", Activity.MODE_PRIVATE));
						archivos.guardar(archivoSalida, info);
					} catch (FileNotFoundException e2) {

					}
				}
			}
			if(params[1].equals("datosInfusiones")){
				String[] param = { "registroInfusionOldPro", params[2] };
				JSONArray respuesta = ws.conectar(param);
				try {
					json_data = respuesta.getJSONObject(0);
					resultado = json_data.getBoolean("respuesta");
					if (resultado) {
						archivoSalida = new OutputStreamWriter(openFileOutput(
								"infusiones.txt", Activity.MODE_PRIVATE));
						archivos.guardar(archivoSalida, "");
					}
				} catch (JSONException e) {

				} catch (FileNotFoundException e) {

				}
			}
			return null;
		}

		@Override
		protected void onPostExecute(Void result) {
			super.onPostExecute(result);
		}

	}
	
	 @Override
	  public void onStart() {
	    super.onStart();
	    EasyTracker.getInstance(this).activityStart(this); 
	    if (!proveedor.equals("")) {
			// Register the listener with the Location Manager to receive location updates
			locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
		}
	  }
	 
	 @Override
	  public void onStop() {
	    super.onStop();
	    EasyTracker.getInstance(this).activityStop(this); 
	    this.locationManager.removeUpdates(this.geo);
	  }
	 
	 @Override
		public void onResume() {
			super.onResume();
			// Activamos notificaciones de localizaci???n
			if (!proveedor.equals("")) {
				// Register the listener with the Location Manager to receive location updates
				locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, this.geo);
			}
		}

		@Override
		public void onPause() {
			super.onPause();
			// Desactivamos notificaciones para ahorrar bater???a
			this.locationManager.removeUpdates(this.geo);
		}
}
